/**
 * require的源码
 * @param {string} modulePath 路径
 * @returns {object} 模块对象exports.default
 */
function require(modulePath) {
  // 1. 解析模块路径
  const resolvedPath = resolveModulePath(modulePath);

  // 2. 判断模块是否已经被缓存
  if (require.cache[resolvedPath]) {
    return require.cache[resolvedPath].exports;
  }

  // 3. 创建一个新的模块对象，并把它缓存起来
  const module = { exports: {} };
  require.cache[resolvedPath] = module;

  // 4. 加载模块代码，并执行模块代码
  const moduleWrapper = wrapModuleCode(fs.readFileSync(resolvedPath));
  moduleWrapper.call(module.exports, module.exports, require);

  // 5. 返回模块的导出对象
  return module.exports;
}

require.cache = {};

function resolveModulePath(modulePath) {
  // 省略模块路径解析的具体实现
}

function wrapModuleCode(code) {
  // 省略模块代码包装的具体实现
}
